﻿/*
-----------------------------------------------------------------------------
This source file is part of Cell Cloud.

Copyright (c) 2009-2012 Cell Cloud Team - cellcloudproject@gmail.com

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-----------------------------------------------------------------------------
*/

#ifndef CellLoggerManager_h
#define CellLoggerManager_h

#include "CellPrerequisites.h"
#include "CellSingleton.h"
#include "CellString.h"
#include "CellLogger.h"

namespace cell
{
/** \addtogroup Core
 * @{
 */
/** \addtogroup General
 * @{
 */

/** 为客户程序提供日志的创建和回收功能。
@author
	Jiangwei Xu
@remarks
	该类可以创建并回收日志对象。
@par
	默认情况下，Nucleus 会自动初始化 LoggerManager 对象，并使用 LoggerManager
	创建一个默认的日志对象。
*/
class _CellExport LoggerManager : public Singleton<LoggerManager>, public LoggerAlloc
{
protected:
	typedef map<String, Logger*>::type	LogList;

	/// 存储了所有日志的列表。
	LogList mLogs;

	/// 默认日志。
	Logger* mDefaultLog;

public:
	CELL_AUTO_MUTEX // 设置为 public 允许外部程序加锁

	LoggerManager(void);
	~LoggerManager(void);

	/** 创建一个给定名称的日志。
	@param
		name 指定日志的名称。例如：'cell.log' 。
	@param
		defaultLog 如果设置为 \c true 则将该新创建的日志设置为默认日志，
		日志信息将发送给这个新创建的日志进行输出。
	@param
		debuggerOutput 如果设置为 \c true 则将消息输出到 Debugger 。
	@param
		suppressTerminalOutput 如果设置为 \c true 则将不会向客户程序的终端输出日志消息。
	*/
	Logger* createLogger(const String& name, bool defaultLog = false, bool debuggerOutput = true, 
		bool suppressTerminalOutput = true);

	/** 从管理内获得指定名称的日志。
	*/
	Logger* getLogger(const String& name);

	/** 返回当前的默认日志句柄。
	*/
	Logger* getDefaultLogger();

	/** 关闭并移除指定名称的日志。
	*/
	void destroyLogger(const String& name);
	/** 关闭并删除指定日志。
	*/
	void destroyLogger(Logger* logger);

	/** 设置指定的日志为默认日志。
	@return
		之前的默认日志。
	*/
	Logger* setDefaultLogger(Logger* newLogger);

	/** 记录消息到默认日志内。
	*/
	void log(const String& message, LogMessageLevel lml = LML_NORMAL, 
		bool maskDebug = false);

	/** 返回默认日志使用的流。
	*/
	Logger::Stream stream(LogMessageLevel lml = LML_NORMAL, 
		bool maskDebug = false);

	/** 设置日志细节等级。
	*/
	void setLogDetail(LoggingLevel ll);

public:
	/** 覆盖标准 Singleton 检索方法。
	*/
	static LoggerManager& getSingleton(void);
	/** 覆盖标准 Singleton 检索方法。
	*/
	static LoggerManager* getSingletonPtr(void);
};

/** @} */
/** @} */
} // end namespace cell

#endif // CellLoggerManager_h
